// LRC伪BNF
// time       ::= \d\d:\d\d(\.\d\d)?
// timestamp  ::= \[   time   \]
// sentence   ::= .+
// line       ::= (timestamp  \s*)+  sentence  \s*
// lrc        ::= (line)+$

/**
 * Simple LRC解析器
 * @constructor
 */
function LrcParser() {
    // do nothing
}


/**
 * 解析指定文本
 * @param lrc LRC格式的歌词文本
 * @return {SongModel} SongModel的实例
 */
LrcParser.prototype.do = function (lrc) {

    // 基本块
    var timestamp = '(\\[(\\d\\d):(\\d\\d)(?:\\.(\\d\\d))?\\])\\s*';  // 时间戳
    //var timestamps = '(' + timestamp + '\\s*)+';
    var sentence = '([^\\[\\]]+)\\s*';                                    // 歌词
    var blocks = timestamp + '|' + sentence;
    //var line = timestamps + sentence + '\\s*';
    //var lrc = '(?:' + line + ')+$';
    var pattern = new RegExp(blocks, 'g');                                 // 时间戳+歌词
    var offsetReg = /\[offset:(\d+)\]/;                                    // 偏移量


    // 基本参数
    var result;
    var tags = []; // 保留未使用的时间戳
    var model = new SongModel();

    // 获取偏移量
    var offset = 0;
    var matchs = lrc.match(offsetReg)
    if (matchs) {
        offset = Number(matchs[1]);
    }
    offset -= 500; // 小于零使得下一句歌词更早显示

    // 开始匹配
    console.log('offset:' + offset);
    while ((result = pattern.exec(lrc))) {
        if (result[5]) {
            // 歌词
            for (var i = 0; i < tags.length; i++) {
                model.lrcs.push(new LrcModel(
                    tags[i],
                    this._trim(result[5])
                ));
            }
            tags = []; // 时间标记已使用过, 清空
        } else {
            // 时间戳
            var timeTag = Number(result[2]) * 60000 + Number(result[3]) * 1000
                + Number(result[4] ? result[4] : 0) * 10 + offset; // 这里到底是加还是减啊??
            tags.push(timeTag);
        }
    }

    // 排序
    model.lrcs.sort(function (a, b) {
        return a.time - b.time;
    })
    return model;
}


// 移除左右两边空白符
LrcParser.prototype._trim = function (str) {
    str = str.replace(/^\s+/, '');
    str = str.replace(/\s+$/, '');
    return str;
}
